<?php
/**
 * @author		João Batista Neto
 * @brief		Objetos que representam cada tipo do retorno da API
 * @package		dso.buscape.result.type
 */

require_once 'dso/buscape/result/type/BuscapeComposite.php';

/**
 * @brief		Item de uma especifiação
 * @class		BuscapeItem
 * @ingroup		Types
 */
class BuscapeItem extends BuscapeComposite {
	/**
	 * @brief	Nome do item
	 * @var		string
	 */
	private $label;

	/**
	 * @brief	Verifica se um filho é aceitável pelo componente
	 * @param	$child BuscapeComponent
	 * @return	boolean
	 * @see		BuscapeComponent.accept()
	 */
	protected function accept( IObject $child ){
		if ( parent::accept( $child ) ){
			$reflection = $child->getClass();

			return $reflection->getName() == 'BuscapeValue' || $reflection->isSubclassOf( 'BuscapeValue' );
		}

		return false;
	}

	/**
	 * @brief	Cria uma instância do objeto com os argumentos passados
	 * @param	$args array Lista de argumentos que serão utilizados para criação do objeto
	 * @return	BuscapeItem
	 */
	public static function createInstante( array $args ){
		$item = new BuscapeItem();

		foreach ( $args as $property => $value ){
			$item->$property = $value;
		}

		return $item;
	}

	/**
	 * @brief	Recupera o nome do item
	 * @return	string
	 */
	public function getLabel(){
		return $this->label;
	}

	/**
	 * @brief	Recupera o primeiro valor disponível
	 * @details	Um único item pode possuir vários valores, para recuperar toda
	 * a lista de valores de um item utilize o método getIterator().
	 * @return	mixed
	 * @see		Component.getIterator()
	 */
	public function getValue(){
		return $this->getIterator()->current()->getValue();
	}
}